'''
在一个完整的应用程序中，通常会有很多个相关模型，比如

请求模型需要有 password
响应模型不应该有 password
数据库模型可能需要一个 hash 加密过的 password

多个模型的栗子
需求
注册功能
请求输入密码
响应不需要输出密码
数据库存储加密后的密码
'''

import uvicorn
from fastapi import FastAPI
from typing import Optional
from pydantic import BaseModel, EmailStr, Field

app = FastAPI()


# 请求模型
class UserIn(BaseModel):
    username: str
    password: str
    email: EmailStr
    full_name: Optional[str] = None


# 响应模型
class UserOut(BaseModel):
    username: str
    email: EmailStr
    full_name: Optional[str] = None


# 数据库模型
class UserInDB(BaseModel):
    username: str
    hashed_password: str
    email: EmailStr
    full_name: Optional[str] = None


# 加密算法
def fake_password_hasher(password: str) -> str:
    return "supersecret" + password


# 数据库存储
def fake_save_user(user: UserIn):
    # 取出用户的密码进行加密
    hash_password = fake_password_hasher(user.password)
    # 转换为数据库模型
    userInDB = UserInDB(**user.dict(), hashed_password=hash_password)
    # 返回数据
    return userInDB


@app.post("/user", response_model=UserOut)
async def create_user(user: UserIn):
    # 创建用户，落库
    user_saved = fake_save_user(user)
    # 返回存储后的用户信息
    return user_saved

if __name__ == '__main__':
    uvicorn.run(app='main:app', host='127.0.0.1', port=8000, reload=True, debug=True)
